home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / tcqb.arc / TCSERIAL.C < prev   
Text File  |  1988-02-10  |  3KB  |  178 lines

  1. #pragma inline
  2.  
  3. unsigned char cdecl __inportb__(int portid);
  4. void cdecl __outportb__ (int portid, unsigned char value);
  5. #define inp(portid) __inportb__(portid)
  6. #define outp(portid,v) __outportb__(portid,v)
  7.  
  8. #define inqsize (24576)
  9.  
  10. unsigned char *inqh,*inqt;
  11. unsigned char inq[inqsize];
  12. unsigned char *inend;
  13. unsigned int inqcnt;
  14.  
  15. extern void *malloc(unsigned int);
  16.  
  17. unsigned int base=0x3f8;
  18. unsigned char intnum=12;    /* COM1 interrupt vector # */
  19. unsigned char intmask=0x10;    /* bit mask for 8259. */
  20.  
  21. #define tval (*(unsigned long far *)0x0040006cl)
  22.  
  23. void cputc(c)
  24. unsigned char c;
  25. {
  26.     unsigned long ov;
  27.  
  28.     ov=tval;
  29.     while(!(inp(base+5)&0x20) || !(inp(base+6)&0x10))
  30.     {
  31.         if((tval-ov)>2000)    /* about 10 seconds timeout */
  32.         {
  33.             sput("\r\nCOM Port not responding\r\n");
  34.             exit(1);
  35.         }
  36.     }
  37.     outp(base,c);
  38. }
  39.  
  40. getcom()
  41. {
  42.     int c;
  43.  
  44.     if(inqcnt)
  45.     {
  46.         c=*inqt++;
  47.         if(inqt>=inend)
  48.             inqt=inq;
  49.         --inqcnt;
  50.         return c;
  51.     }
  52.     return -1;
  53. }
  54.  
  55. cgetc(count10)
  56. unsigned int count10;
  57. {
  58.     unsigned long ov;
  59.  
  60.     count10<<=1;
  61.     ov=tval;
  62.     while((tval-ov)<count10)
  63.     {
  64.         if(inqcnt)
  65.             return getcom();
  66.     }
  67.     return -1;
  68. }
  69.  
  70. unsigned long vecsave;
  71. unsigned char intrreg,intrchp,savp;
  72.  
  73. cominit(baud,port)
  74. unsigned int baud;
  75. unsigned char port;
  76. {
  77.     inqh=inqt=inq;
  78.     inend=inq+inqsize;
  79.     inqcnt=0;
  80.     if(port==1)
  81.     {
  82.         base=0x3f8;
  83.         intnum=12;
  84.         intmask=0x10;
  85.     }
  86.     else    /* if using COM2, adjust I/O ports, and Int vectors */
  87.     {
  88.         base=0x2f8;
  89.         intnum=11;
  90.         intmask=0x8;
  91.     }
  92.     asm mov cs:dataadd,ds    /* mov 'C' dataseg address to var. */
  93.     asm mov ah,35h        /* ask DOS for current int vector */
  94.     asm mov al,intnum
  95.     asm int 21h
  96.     asm mov word ptr vecsave,bx
  97.     asm mov word ptr vecsave+2,es
  98.     asm mov ah,25h        /* ask DOS to set new int vector */
  99.     asm mov al,intnum
  100.     asm push ds
  101.     asm mov dx,cs
  102.     asm mov ds,dx
  103.     asm mov dx,offset intsr    /* addr of interupt service in DS:DX */
  104.     asm int 21h
  105.     asm pop ds
  106.     asm cli
  107.     intrreg=inp(base+1);    /* sav contents of interupt enable reg. */
  108.     outp(base+1,0);    /* disable interupts for now */
  109.     intrchp=inp(0x21);
  110.     outp(0x21,intrchp&~intmask);
  111.     savp=inp(base+3);    /* save data, stop, parity */
  112.     if(baud)
  113.     {
  114.         outp(base+3,0x80);
  115.         asm mov dx,1
  116.         asm mov ax,0c200h
  117.         asm div word ptr baud
  118.         asm mov baud,ax
  119.         outp(base,baud);    /* output new baud to divisor latch */
  120.         outp(base+1,baud>>8);
  121.     }
  122.     outp(base+3,3);    /* set 8 data, 1 stop, no parity */
  123.     outp(base+4,0xb);    /* turn on DTR, RTS and enable ints */
  124.     outp(0x20,0x20);    /* send EOI to 8259 */
  125.     inp(base);
  126.     outp(base+1,1);    /* now turn on 8250 interupts */
  127.     asm sti
  128.     asm pop bp
  129.     asm ret
  130.  
  131.     asm dataadd dw 0
  132.  
  133.     asm intsr: push  ds
  134.     asm push ax
  135.     asm push dx
  136.     asm push bx
  137.     asm mov ds,dataadd
  138.     asm mov ax,inqcnt
  139.     asm cmp ax,inqsize
  140.     asm jae overflow
  141.     asm mov dx,base
  142.     asm in al,dx
  143.     asm mov bx,inqh
  144.     asm mov [bx],al
  145.     asm inc bx
  146.     asm cmp bx,inend
  147.     asm jb okinqh
  148.     asm mov bx,offset inq
  149. okinqh:
  150.     asm mov inqh,bx
  151.     asm inc inqcnt
  152. overflow:
  153.     asm mov al,020h     /* send EOI to 8259 */
  154.     asm out 20h,al
  155.     asm pop bx
  156.     asm pop dx
  157.     asm pop ax
  158.     asm pop ds
  159.     asm iret
  160. }
  161.  
  162. comrest()
  163. {
  164.     asm cli
  165.     outp(base+1,intrreg);
  166.     outp(0x21,intrchp);
  167.     outp(base+3,savp);
  168.     asm sti
  169.     asm mov ah,25h
  170.     asm mov al,intnum
  171.     asm push ds
  172.     asm lds dx,dword ptr vecsave
  173.     asm int 21H
  174.     asm pop ds
  175. }
  176.  
  177.  
  178.